package com.caregiver.watch.business.data.dao;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.caregiver.watch.business.data.model.po.SportData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

import static com.caregiver.watch.common.constant.DataSourceName.SHARDING;

@Mapper
@DS(SHARDING)
public interface SportDataDao {
    
    /**
     * 插入运动数据
     * @param sportData 运动数据对象
     * @return 影响行数
     */
    int insert(SportData sportData);
    
    /**
     * 批量插入运动数据
     * @param sportDataList 运动数据列表
     * @return 影响行数
     */
    int batchInsert(@Param("sportDataList") List<SportData> sportDataList);
    
    /**
     * 根据ID查询运动数据
     * @param id 主键ID
     * @return 运动数据对象
     */
    SportData selectById(Long id);
    
    /**
     * 根据设备ID和时间范围查询运动数据
     * @param deviceId 设备ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 运动数据列表
     */
    List<SportData> selectByDeviceUuIdAndTimeRange(@Param("deviceId") String deviceId,
                                                 @Param("startTime") Date startTime,
                                                 @Param("endTime") Date endTime);
    
    /**
     * 根据设备ID查询最新的运动数据
     * @param deviceId 设备ID
     * @return 运动数据对象
     */
    SportData selectLatestByDeviceUuId(@Param("deviceId") String deviceId);
    
    /**
     * 根据设备ID和时间删除运动数据
     * @param deviceId 设备ID
     * @param beforeTime 指定时间之前的数据
     * @return 影响行数
     */
    int deleteByDeviceUuIdAndTime(@Param("deviceId") String deviceId,
                                @Param("beforeTime") Date beforeTime);
    
    /**
     * 更新运动数据
     * @param sportData 运动数据对象
     * @return 影响行数
     */
    int update(SportData sportData);

    /**
     * 统计用户在指定设备上的运动数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param userId 用户ID
     * @param deviceUuId 设备ID
     * @return 运动数据列表
     */
    List<SportData> queryUserSportData(@Param("startTime") LocalDateTime startTime,
                                            @Param("endTime") LocalDateTime endTime,
                                            @Param("userId") Long userId,
                                            @Param("deviceUuId") String deviceUuId);

    /**
     * 统计用户在指定设备上的运动数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param userId 用户ID
     * @param deviceUuId 设备ID
     * @return 运动数据列表
     */
    List<SportData> queryStepCountAndDataTime(@Param("startTime") LocalDateTime startTime,
                                       @Param("endTime") LocalDateTime endTime,
                                       @Param("userId") Long userId,
                                       @Param("deviceUuId") String deviceUuId);
}
